/*
 * ISTY 1
 * Projet IDD
 * Jeu de société Caylus
 *
 * Groupe 9:
 *      Bedhiaf Mouna
 *      Joober Nizar
 *      Labassi Amine
 *      Sridi Med Mahdi
 * Année 2008/2009
 */
package caylus.Model;

import java.util.ArrayList;

import java.awt.Color;
import java.io.Serializable;
/**
 * représente le joueur humain qui est considéré le maître d'oeuvre.
 */
public class Joueur implements Serializable{

	private String _nom;
	private Color _couleur;
	private ArrayList<Ouvrier> _ouvriers;
	private int _prestige;
    public int NbConstructionDonjon = 0 ;
    public int NbConstructionMurailles = 0 ;
    public int NbConstructionTours = 0 ;
    public int TFpositionL1 = 1 ;
    public int TFpositionL2 = 1 ;
    public int TFpositionL3 = 1 ;
    public int TFpositionL4 = 1 ;
    public int TFligneTouche = 0 ;

    /**
     * affecte une valeur au prestige du joueur.
     * @param _prestige
     */
    public void set_prestige(int _prestige) {
        this._prestige = _prestige;
    }
    /**
     * additionne une valeur au prestige.
     * @param _prestige
     */
    public void modifierPrestige(int _prestige) {
        this._prestige += _prestige;
    }
	private Lot _ressources;
	private transient Croupier _leCroupier; // tout joueur a besoin de communiquer avec LE croupier
	private boolean _estActif ;
	private boolean _payeUniquementUnDenierPourPlacerSesOuvriers;  // Le pouvoir de l'Auberge "batiment spécial"
	private int _nbResidences;
	private int _nbBibliotheques;
	private int _nbHotels;
    private int _faveurs = 0 ;
    private boolean _aLePermisDeConstruireBatimentBleu = false;
    private boolean _aLePermisDeConstruireBatimentMarron = false;
    private boolean _aLePermisDeConstruireBatimentGris = false;
    private boolean _aLePermisDeConstruireBatimentVert = false;
    /**
     * constructeur
     * @param pNom
     */
	public Joueur(String pNom){
		 _nom = pNom;
        _ressources = new Lot(0,1,0,0,0,2);
		_estActif = true ;
        initialiserLesOuvriers();
    }
    /**
     * initialise les ouvriers employés par le joueur.
     */
    public void initialiserLesOuvriers(){
        Ouvrier ouvrierUn = new Ouvrier("ouvrierUn", this);
        Ouvrier ouvrierDeux = new Ouvrier("ouvrierDeux", this);
        Ouvrier ouvrierTrois = new Ouvrier("ouvrierTrois", this);
        Ouvrier ouvrierQuatre = new Ouvrier("ouvrierQuatre", this);
        Ouvrier ouvrierCinq = new Ouvrier("ouvrierCinq", this);
        Ouvrier ouvrierSix = new Ouvrier("ouvrierSix", this);
        _ouvriers = new ArrayList<Ouvrier>(6);
        _ouvriers.add(ouvrierUn);
        _ouvriers.add(ouvrierDeux);
        _ouvriers.add(ouvrierTrois);
        _ouvriers.add(ouvrierQuatre);
        _ouvriers.add(ouvrierCinq);
        _ouvriers.add(ouvrierSix);
    }
    /**
     * place un ouvrier dans une case.
     * @param pCase
     * @param pOuvrier
     */
    public void placerOuvrierDansUneCase(Case pCase, Ouvrier pOuvrier){
		if ( _leCroupier._cases.get(4).equals(pCase)) {
            if( pCase.getOuvrier() == null) {
                _ouvriers.remove(pOuvrier);
                pCase.setOuvrier(pOuvrier);
                pCase.setOccupee(true);
            }   else    {
                
            }
        }   else    {
            _ouvriers.remove(pOuvrier);
            pCase.setOuvrier(pOuvrier);
            pCase.setOccupee(true);
            //if (!pCase.estCaseSpeciale())
            if(pCase._positionDansLePlateau > 6 & pCase.getEtiquette() != null)
                pCase.getEtiquette().set_joueurOccupant(pOuvrier.getPatron());
        }
	}
    /**
     * place un ouvrier dans le château.
     * @param pChateau
     * @param pOuvrier
     */
	public void placerOuvrierDansLeChateau(Chateau pChateau, Ouvrier pOuvrier){
		_ouvriers.remove(pOuvrier);
		pChateau.ajouterOuvrier(pOuvrier); // à verifier
	}
    /**
     * récupère un ouvrier d'une case.
     * @param pCase
     */
	public void recupererOuvrierDuneCase(Case pCase){
		_ouvriers.add(pCase.getOuvrier());
		pCase.setOuvrier(null);
	}
    /**
     * récupère un ouvrier du château.
     * @param pChateau
     * @param pOuvrier
     */
	public void recupererOuvrierDuChateau(Chateau pChateau, Ouvrier pOuvrier){
		_ouvriers.add(pOuvrier);
		pChateau.supprimerOuvrier(pOuvrier);
	}

	/*
	 * Le joueur demande au croupier de lui deplacer le prevot
	 * ainsi le croupier pourra encaisser les frais  de l'opération.
	 * Donc il faut que le joueur passe sa réference en parametre.
	 */
	public void deplacerPrevot(int pNbCases, Joueur pJoueur){
		_leCroupier.deplacerLePrevot(pNbCases, this);
	}

	public void payerEnDeniers(int pNbDeniers){
		_ressources.setDeniers(_ressources.getDeniers() - pNbDeniers);
	}

	public void recevoirDeniers(int pNbDeniers){
		_ressources.setDeniers(_ressources.getDeniers() + pNbDeniers);
	}

    public void passerLeTour(){
		_estActif = false;
	}

	public boolean estActif(){
		return _estActif;
	}

	/*
	 *  Le croupier activera tous les joueurs  utilisant cette methode apres chaque tour
	 */
	public void activerJoueur(){
		_estActif = true;
	}

	public void setPayeUniquementUnDenierPourPlacerSesOuvriers(boolean pValeur){
		_payeUniquementUnDenierPourPlacerSesOuvriers = pValeur;
	}

	public boolean getPayeUniquementUnDenierPourPlacerSesOuvriers(){
		return _payeUniquementUnDenierPourPlacerSesOuvriers;
	}

	/*
	 *  ce Set sera utilisé pour la configuration afin d'attribuer un nom au joueur instancié lors de 'initialiserJoueur' du Croupier
	 */
	public void setNom(String pNom){
		_nom = pNom;
	}
	/*
	 * pareil que setNom
	 */
	public void setCouleur(Color pCouleurJoueur){
		_couleur = pCouleurJoueur;
	}

    public Color getCouleur(){
		return _couleur;
	}

	public int getNbResidences(){
		return _nbResidences;
	}

	public int getNbBibliotheques(){
		return _nbBibliotheques;
	}

	public int getNbHotels(){
		return _nbHotels;
	}

    public boolean aLePermisDeConstruireBatimentBleu() {
        return _aLePermisDeConstruireBatimentBleu;
    }

    public boolean aLePermisDeConstruireBatimentGris() {
        return _aLePermisDeConstruireBatimentGris;
    }

    public boolean aLePermisDeConstruireBatimentMarron() {
        return _aLePermisDeConstruireBatimentMarron;
    }

    public boolean aLePermisDeConstruireBatimentVert() {
        return _aLePermisDeConstruireBatimentVert;
    }

    public void set_aLePermisDeConstruireBatimentBleu(boolean _aLePermisDeConstruireBatimentBleu) {
        this._aLePermisDeConstruireBatimentBleu = _aLePermisDeConstruireBatimentBleu;
    }

    public void set_aLePermisDeConstruireBatimentGris(boolean _aLePermisDeConstruireBatimentGris) {
        this._aLePermisDeConstruireBatimentGris = _aLePermisDeConstruireBatimentGris;
    }

    public void set_aLePermisDeConstruireBatimentMarron(boolean _aLePermisDeConstruireBatimentMarron) {
        this._aLePermisDeConstruireBatimentMarron = _aLePermisDeConstruireBatimentMarron;
    }

    public void set_aLePermisDeConstruireBatimentVert(boolean _aLePermisDeConstruireBatimentVert) {
        this._aLePermisDeConstruireBatimentVert = _aLePermisDeConstruireBatimentVert;
    }


    /*
     * SetCroupier permettera au croupier de donner sa référence à tous les joueurs qu'il instanci
     *
     */

    public void setCroupier(Croupier pLeCroupier){
        _leCroupier = pLeCroupier;
    }

    public String getNom(){
        return _nom;
    }

    public int getPrestige(){
        return _prestige;
    }

    public Lot getRessouces() {
        return _ressources ;
    }

    public ArrayList<Ouvrier> getOuvriers() {
        return _ouvriers;
    }

    public int getNbOuvriersDisponibles(){
        int nb = 0;
        for(Ouvrier o : _ouvriers)
        {
            if (o.estDisponible())
                nb++;
        }
        return nb;
    }

    public void setActif(boolean b) {
        _estActif = b ;
    }
    public void gagnerPointsPrestige (int pPrestige) {
        this._prestige += pPrestige ;
    }
    public boolean leJoueurPossedeSuffisamentDeRessource(Lot pPrix) {
        if(pPrix.getBois()<=_ressources.getBois() & pPrix.getDeniers()<= _ressources.getDeniers() & pPrix.getNouriture() <= _ressources.getNouriture() & pPrix.getOr() <= _ressources.getOr() & pPrix.getPierre()<= _ressources.getPierre() & pPrix.getTissu()<= _ressources.getTissu())
            return true ;
        return false ;
    }
    public void payer(Lot pPrix) {
        this._ressources.setBois(this._ressources.getBois()- pPrix.getBois());
        this._ressources.setDeniers(this._ressources.getDeniers()- pPrix.getDeniers());
        this._ressources.setNouriture(this._ressources.getNouriture()- pPrix.getNouriture());
        this._ressources.setOr(this._ressources.getOr()- pPrix.getOr());
        this._ressources.setPierre(this._ressources.getPierre()- pPrix.getPierre());
        this._ressources.setTissu(this._ressources.getTissu()- pPrix.getTissu());
    }

    public void recevoir(Lot pRessources){
        this._ressources.setBois(this._ressources.getBois()+ pRessources.getBois());
        this._ressources.setDeniers(this._ressources.getDeniers()+ pRessources.getDeniers());
        this._ressources.setNouriture(this._ressources.getNouriture() + pRessources.getNouriture());
        this._ressources.setOr(this._ressources.getOr()+ pRessources.getOr());
        this._ressources.setPierre(this._ressources.getPierre()+ pRessources.getPierre());
        this._ressources.setTissu(this._ressources.getTissu()+ pRessources.getTissu());
    }


    public void gagnerFaveurDeRoi(int faveurs) {
        this._faveurs += faveurs ;
    }

}
